home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 031-040 / amok32 / patterns / patterns.mod < prev    next >
Text File  |  1993-11-04  |  2KB  |  56 lines

  1. (**********************************************************************
  2.  
  3.     :Program.    Patterns.mod
  4.     :Contents.   Procedure to test pattern matching of filenames
  5.     :Author.     Nicolas Benezan [bne]
  6.     :Address.    Postwiesenstr. 2, D7000 Stuttgart 60
  7.     :Phone.      711/333679
  8.     :Copyright.  Public Domain
  9.     :Language.   Modula-2
  10.     :Translator. M2Amiga A+L V3.27d
  11.     :History.    V1.0 [bne] 24.Dec.1989
  12.     :History.    V1.1 [bne] 31.Dec.1989 (imports Str instead of StringOps)
  13.  
  14. **********************************************************************)
  15.  
  16. IMPLEMENTATION MODULE Patterns;
  17.  
  18. FROM Str        IMPORT Length;
  19.  
  20. PROCEDURE Match (Pattern: ARRAY OF CHAR;
  21.                  String: ARRAY OF CHAR): BOOLEAN;
  22.   VAR
  23.     MaxPat, MaxStr: INTEGER;
  24.  
  25.   PROCEDURE Test (PatPos, StrPos: INTEGER): BOOLEAN;
  26.     BEGIN
  27.       IF PatPos = MaxPat THEN
  28.         IF StrPos = MaxStr THEN
  29.           RETURN TRUE
  30.         END;
  31.       ELSE
  32.         CASE Pattern[PatPos] OF
  33.         |"*":
  34.           RETURN Test (PatPos + 1, StrPos) OR
  35.                  (StrPos < MaxStr) AND Test (PatPos, StrPos + 1)
  36.         |"?":
  37.           RETURN (StrPos < MaxStr) AND
  38.                  Test (PatPos + 1, StrPos + 1)
  39.         ELSE
  40.           RETURN (StrPos < MaxStr) AND
  41.                  (String[StrPos] = Pattern[PatPos]) AND
  42.                  Test (PatPos + 1, StrPos + 1)
  43.         END;
  44.       END;
  45.       RETURN FALSE
  46.     END Test;
  47.  
  48.   BEGIN
  49.     MaxPat:= Length (Pattern);
  50.     MaxStr:= Length (String);
  51.     RETURN Test (0, 0)
  52.   END Match;
  53.  
  54. END Patterns.
  55.  
  56.